Before working with the package rjags you will need to separately install JAGS.

In this example, we build a linear regression model, and include to finish, add a random effect. Models are run in JAGS.

library(rjags)
Loading required package: coda
Linked to JAGS 4.3.0
Loaded modules: basemod,bugs
# load lme4 only to access the dataset
# We could just address it long hand via lme4::sleepstudy but im being lazy.
library(lme4)
Loading required package: Matrix
library(ggplot2)

Sleepstudy dataset

We will use the ‘sleepstudy’ dataset from the package lme4 which matches the simple linear effects model with a random effect in the example for the general linear mixed effects fitting function ?lme4::lmer.

From the help file associated with ?sleepstudy: The average reaction time per day for subjects in a sleep deprivation study. On day 0 the subjects had their normal amount of sleep. Starting that night they were restricted to 3 hours of sleep per night. The observations represent the average reaction time on a series of tests given each day to each subject.

Ultimately we might fit a mixed effects model comprising a linear effect of the variable Days on the average Reaction time, with a random effect for each Subject but we will build toward this gradually. While it might be tempting to start with a linear regression and add in the random effect afterwards, I think it is conceptually easier to understand the random effect if we start by building a variance components model which is essentially a hierarchical model with a grand mean and a set of nested variances. We can then easily add in the linear part afterwards.

But first… lets build the basic model that is just a single grand mean and a single error term. We might call this our Null Model since it really is as simple as we can get and if we cant improve on this model then we cant really say anything about what is affecting reaction times other than it has a number and everyone varies around that number randomly.

A null model

This model basically comprises a mean and a standard deviation and so we could visualise our data a priori as either a histogram, or as a boxplot, or as an errorbar plot.

# create a histogram of the Reacion time data, and add some extra
# white space above to allow us add an error bar plot to represent the 
# mean and standard deviation.
hist(sleepstudy$Reaction, breaks = 10, ylim = c(0, 35))
# add a point and text for the mean
mu <- mean(sleepstudy$Reaction)
points(mu, 30, pch = 20)
text(mu, 33, labels = round(mu))
# add a horizontal line for the +/- sd
ss <- sd(sleepstudy$Reaction)
lines(c(mu - ss, mu + ss), c(30, 30), col = "black")

First we define our model as a string for JAGS.

# Define our model
modelstring <- '
  model {
    # Likelihood
    for (i in 1:N){
      Y[i] ~ dnorm(mu[i], tau)
      mu[i] <- b0
    }
    
    # ---------------------------------------
    # Priors
    # prior on the intercept / grand mean
    b0 ~ dnorm(0, 100 ^ -2)
    # prior on the standard deviation of the error term
    # which is then converted to precision.
    sigma ~ dunif(0, 100)
    tau <- 1 / (sigma ^ 2) 
  }
'

Now we need to bundle up our data and pass it to rjags for fitting.

# Set up data
data = list( N = nrow(sleepstudy),
             Y = sleepstudy$Reaction)
# open a text connection for our modelstring. This has the effect of 
# creating a file that doesnt exist on our drives as we consider a *.txt file 
# to exist, but essentially the computer then treats them the same.
model_connection <- textConnection(modelstring)
# Run jags
model_null <- jags.model(model_connection, data = data, 
                 n.chains = 3, quiet = TRUE)
# we should then close our text connection that we made
close(model_connection)
output <- coda.samples(model=model_null,
                    variable.names=c("b0", "sigma"), 
                    n.iter = 5000,
                    thin = 5)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

Tasks: check that the predictions from our Bayesian model match the simple maximum likelihood calculations of the mean and standard deviation of the reaction times.

Variance Components model - adding the random effect

We may well recognise that there is variation both within and among individual Subjects. For one, identifying where the majority of this variation is would be of interest in terms of directing future efforts either to finding explanatory variables within or among individuals. From a statistical perspective, it is vital to control for this variation when testing among individual effects, as otherwise our calculations of power and hence effect size and significance can be (very far) off.

Visualise variation within and among subjects

# create a boxplot of the Reaction time data broken down by Subject.
# Add horizontal lines for teh grand mean (mu) and grand standard deviation (ss)
# which we created earlier in our first plot of the null model.
g1 <- ggplot(sleepstudy, aes(x = Subject, y = Reaction)) + 
  geom_boxplot() + 
  geom_abline(mapping = aes(intercept = mu, slope = 0), col = "red") + 
  geom_abline(mapping = aes(intercept = mu - ss, slope = 0), 
              col = "red", linetype = 2) + 
  geom_abline(mapping = aes(intercept = mu + ss, slope = 0), 
              col = "red", linetype = 2)
# print this figure to screen
print(g1)

Clearly there is considerable variation within subjects, with some individuals being very much lower than the overall mean, and others much higher. There appears at least by eye, for there to be more variation among individuals than within, where reaction times by individual seem to be reasonably consistent with a few exceptions. Bear in mind there is additional data in the form of a linear effect variable of the experimentally manipulated amount of sleep each subject received prior to testing, and this may help further explain the variation we observe.

Build our hierarchical model of variances

The random effect in this example is by Subject, with multiple observations made on the same subject. In this simple random intercept model, we want to allow individuals to differ from their expected value (the intercept) by a (hopefully relatively) small deviation. The mean of each individuals’ deviations will be described by a normal distribution, and by a variable \(U[j]\) for the jth individual described by \(U_j \sim N(0, \sigma^2_U)\).

We define a new jags model

# Define our model
modelstring <- '
  model {
    # Likelihood
    for (i in 1:N){
      Y[i] ~ dnorm(mu[i], tau)
      # The code U[Subject[i]] looks up the subject identifier for the ith 
      # individual and extracts the corresponding deviation from U which 
      # is defined after the loop over i.
      mu[i] <- b0 + U[Subject[i]]
    }
    # random parts
    #
    # Pull out the random deviations for the variable U, one for each 
    # subject
    for (j in 1:S){
      U[j] ~ dnorm(0, tau_U)
    }
    # we can if we want calcluate the total variance, which is the simple 
    # sum of variances. We would need to monitor this variable if we want to 
    # see it. Remember: while variances are additive, neither 
    # standard deviations nor precisions are.
    var_tot <- (sigma_U ^ 2) + (sigma ^ 2)
    
    # ------------------------------------------
    # Priors
    
    # prior on the grand mean b0 (same as the intercept)
    b0 ~ dnorm(0, 100 ^ -2)
    
    # prior on the residual error termn
    sigma ~ dunif(0, 100)
    tau <- 1 / (sigma ^ 2) 
    # prior on the Subject level error term
    sigma_U ~ dunif(0, 100)
    tau_U <- 1 / (sigma_U ^ 2)
    # ------------------------------------------
  }
'

Now pass on the additional data which is \(S\) the number of subjects in the dataset, and \(Subject\) which is the column Subject in the dataset.

This step is really important in this example

The only thing we need to do is convert this factor labelled column which starts at subject 308 and runs to 372, into a sequence starting at 1 and running to 18: this is acheived easily by using as.numeric(sleepstudy$Subject).

# Set up data
data <- list( N = nrow(sleepstudy), 
              S = length(levels(sleepstudy$Subject)),
              Subject = as.numeric(sleepstudy$Subject),
              Y = sleepstudy$Reaction)
# open a text connection for our modelstring.
model_connection <- textConnection(modelstring)
# Run jags
model_random <- jags.model(model_connection, data = data, 
                 n.chains = 3, quiet = TRUE)
# we should then close our text connection that we made
close(model_connection)
output <- coda.samples(model = model_random,
                    variable.names=c("b0", "sigma", "sigma_U"), 
                    n.iter = 5000,
                    thin = 5)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

And plot the output

# Plot output
plot(output)

Tasks: We could if we wanted, monitor the variable U which is calculated in the jags model we specified. This would give us the subject level effects around the intercept (which in this type of model is the global mean). If we do this, what additional information do we now get in the output object? What might we do to condense this information and make sense of it?

Adding the linear effect

Adding a linear effect of Days of sleep deprivation now creates what many might call a mixed effects model. Really we are just extending our model within the framework of General Linear Models and personally I find much of the nomenclature around specific subsets of models to be unhelful (and I include variance components in this).

We define a new jags model that adds a linear effect of Days: \(b_1 * \text{Days}\) and we remember to specify a prior for this unknown parameter \(b_1\).

# Define our model
modelstring <- '
  model {
    # Likelihood
    for (i in 1:N){
      Y[i] ~ dnorm(mu[i], tau)
      # The code U[Subject[i]] looks up the subject identifier for the ith 
      # individual and extracts the corresponding deviation from U which 
      # is defined after the loop over i.
      mu[i] <- b0 + b1 * X[i] + U[Subject[i]]
    }
    # random parts
    #
    # Pull out the random deviations for the variable U, one for each 
    # subject
    for (j in 1:S){
      U[j] ~ dnorm(0, tau_U)
    }
    
    # ------------------------------------------
    # Priors
    
    # prior on the grand mean b0 (same as the intercept)
    b0 ~ dnorm(0, 100 ^ -2)
    # prior on the slope of the effect of Days
    b1 ~ dnorm(0, 100 ^ -2)
    
    # prior on the residual error termn
    sigma ~ dunif(0, 100)
    tau <- 1 / (sigma ^ 2) 
    # prior on the Subject level error term
    sigma_U ~ dunif(0, 100)
    tau_U <- 1 / (sigma_U ^ 2)
    # ------------------------------------------
  }
'
# Set up data
data <- list( N = nrow(sleepstudy), 
              S = length(levels(sleepstudy$Subject)),
              Subject = as.numeric(sleepstudy$Subject),
              X =  sleepstudy$Days,
              Y = sleepstudy$Reaction)
# open a text connection for our modelstring.
model_connection <- textConnection(modelstring)
# Run jags
model_rand_int <- jags.model(model_connection, data = data, 
                 n.chains = 3, quiet = TRUE)
# we should then close our text connection that we made
close(model_connection)
output <- coda.samples(model=model_rand_int,
                    variable.names=c("b0", "b1", "sigma", "sigma_U"), 
                    n.iter = 5000,
                    thin = 5)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

And plot and explore the output

# summaries of the posteriors
summary(output)

Iterations = 1005:6000
Thinning interval = 5 
Number of chains = 3 
Sample size per chain = 1000 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

          Mean      SD Naive SE Time-series SE
b0      247.39 10.7191  0.19570        0.54797
b1       10.59  0.8035  0.01467        0.01723
sigma    31.25  1.7888  0.03266        0.03538
sigma_U  40.24  8.0724  0.14738        0.17029

2. Quantiles for each variable:

           2.5%    25%    50%    75%  97.5%
b0      226.173 240.52 247.62 254.45 268.06
b1        9.022  10.05  10.59  11.13  12.19
sigma    27.998  30.04  31.13  32.38  35.13
sigma_U  27.442  34.52  39.19  44.57  59.48
# Plot output
plot(output)

Further extending this to random slopes

The model above is technically a random intercept model since only the intercepts for each Subject vary and each individual subject shares the same overall effect of days of sleep deprivation on their reaction time. Since we can build any model we like in the Bayesian framework we can reasonably easily extend our model to allow both random intercepts and random slopes by individual.

Visually this might look like this:

# plot Reaction time by Days of sleep deprivation and colour by Subject.
# use geom_smooth() to add linear estimates for each subject, and 
# suppress the error bars else the plot gets confusing
g3 <- ggplot(sleepstudy, aes(x = Days, y = Reaction, col = Subject)) + 
  geom_point() + 
  geom_smooth(method = lm, se = FALSE)
# print this figure to screen
print(g3)

Build and fit our random slopes model

Task: Before we start coding; how many slopes do we need to esimate? i.e. how many js in \(b_{1}[j]\) do we need?

Since we will be drawing our \(b_1\)s from a normal distribution as we did for the intercepts, we will need to specify a prior for both the mean and the variance for this distribution.

We therefore now have three random terms: residual error, error among the subjects’ intercepts and error among the subjects’ response to sleep deprivation.

# Define our model
modelstring <- '
  model {
    # Likelihood
    for (i in 1:N){
      Y[i] ~ dnorm(mu[i], tau)
      # The code U[Subject[i]] looks up the subject identifier for the ith 
      # individual and extracts the corresponding deviation from U which 
      # is defined after the loop over i.
      mu[i] <- b0 + b1[Subject[i]] * X[i] + U[Subject[i]]
    }
    # random parts
    #
    # Pull out the random deviations for the variable U, one for each 
    # subject.
    # We can also draw the slopes for our individual subjects
    for (j in 1:S){
      U[j] ~ dnorm(0, tau_U)
      b1[j] ~ dnorm(mu_b1, tau_b1)
    }
    
    # ------------------------------------------
    # Priors
    
    # prior on the grand mean b0 (same as the intercept)
    b0 ~ dnorm(0, 100 ^ -2)
    # prior on the mean and variabnce of slope of the effect of Days
    mu_b1 ~ dnorm(0, 100 ^ -2)
    sigma_b1 ~ dunif(0, 100)
    tau_b1 <- 2 / (sigma_b1 ^ 2)
    
    # prior on the residual error termn
    sigma ~ dunif(0, 100)
    tau <- 1 / (sigma ^ 2) 
    # prior on the Subject level error term
    sigma_U ~ dunif(0, 100)
    tau_U <- 1 / (sigma_U ^ 2)
    # ------------------------------------------
  }
'
# Set up data
data <- list( N = nrow(sleepstudy), 
              S = length(levels(sleepstudy$Subject)),
              Subject = as.numeric(sleepstudy$Subject),
              X =  sleepstudy$Days,
              Y = sleepstudy$Reaction)
# open a text connection for our modelstring.
model_connection <- textConnection(modelstring)
# Run jags
model_rand_slopes <- jags.model(model_connection, data = data, 
                 n.chains = 3, quiet = TRUE)
# we should then close our text connection that we made
close(model_connection)
output <- coda.samples(model = model_rand_slopes,
                    variable.names=c("b0", "mu_b1", "sigma_b1", 
                                     "sigma", "sigma_U"), 
                    n.iter = 5000,
                    thin = 5)

  |                                                        
  |                                                  |   0%
  |                                                        
  |*                                                 |   2%
  |                                                        
  |**                                                |   4%
  |                                                        
  |***                                               |   6%
  |                                                        
  |****                                              |   8%
  |                                                        
  |*****                                             |  10%
  |                                                        
  |******                                            |  12%
  |                                                        
  |*******                                           |  14%
  |                                                        
  |********                                          |  16%
  |                                                        
  |*********                                         |  18%
  |                                                        
  |**********                                        |  20%
  |                                                        
  |***********                                       |  22%
  |                                                        
  |************                                      |  24%
  |                                                        
  |*************                                     |  26%
  |                                                        
  |**************                                    |  28%
  |                                                        
  |***************                                   |  30%
  |                                                        
  |****************                                  |  32%
  |                                                        
  |*****************                                 |  34%
  |                                                        
  |******************                                |  36%
  |                                                        
  |*******************                               |  38%
  |                                                        
  |********************                              |  40%
  |                                                        
  |*********************                             |  42%
  |                                                        
  |**********************                            |  44%
  |                                                        
  |***********************                           |  46%
  |                                                        
  |************************                          |  48%
  |                                                        
  |*************************                         |  50%
  |                                                        
  |**************************                        |  52%
  |                                                        
  |***************************                       |  54%
  |                                                        
  |****************************                      |  56%
  |                                                        
  |*****************************                     |  58%
  |                                                        
  |******************************                    |  60%
  |                                                        
  |*******************************                   |  62%
  |                                                        
  |********************************                  |  64%
  |                                                        
  |*********************************                 |  66%
  |                                                        
  |**********************************                |  68%
  |                                                        
  |***********************************               |  70%
  |                                                        
  |************************************              |  72%
  |                                                        
  |*************************************             |  74%
  |                                                        
  |**************************************            |  76%
  |                                                        
  |***************************************           |  78%
  |                                                        
  |****************************************          |  80%
  |                                                        
  |*****************************************         |  82%
  |                                                        
  |******************************************        |  84%
  |                                                        
  |*******************************************       |  86%
  |                                                        
  |********************************************      |  88%
  |                                                        
  |*********************************************     |  90%
  |                                                        
  |**********************************************    |  92%
  |                                                        
  |***********************************************   |  94%
  |                                                        
  |************************************************  |  96%
  |                                                        
  |************************************************* |  98%
  |                                                        
  |**************************************************| 100%

And plot the output

# summaries of the posteriors
summary(output)

Iterations = 1005:6000
Thinning interval = 5 
Number of chains = 3 
Sample size per chain = 1000 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

            Mean    SD Naive SE Time-series SE
b0       249.965 7.449  0.13600        0.31129
mu_b1     10.523 1.742  0.03180        0.03059
sigma     25.779 1.531  0.02796        0.02796
sigma_U   27.225 6.670  0.12177        0.15454
sigma_b1   9.189 2.007  0.03664        0.04117

2. Quantiles for each variable:

            2.5%     25%     50%    75%  97.5%
b0       235.139 245.301 250.023 254.70 264.74
mu_b1      7.172   9.390  10.516  11.61  14.06
sigma     23.109  24.711  25.662  26.71  29.15
sigma_U   16.258  22.564  26.443  30.93  42.85
sigma_b1   6.027   7.785   8.946  10.30  13.77
# Plot output
plot(output)

Tasks: as before, we might want to extract the actual slopes for each individual. What parameter would we add to monitor list to acheive this? Do these estimates match the visualisation of the data we made above?

Comparing among models

Bayesian models have DIC as an analogue to the maximum likelihood founded AIC scores, and they work in much the same way: lower scores indicate improved model fit balanced against the number of parameters involved. We can use dic.samples() to quickly caluclate these scores for our four models. Just bear in mind that as with frequentist or maximum likelihood approaches, calculation of the number of parameters in random effects models can be complicated, and in many instances dic.samples() may not run or be reliable.

I have opted for just 1000 samples on which to calculate DIC, but you may want to increase this.


# first the null model
dic.samples(model_null)

# then our two level random effects model
dic.samples(model_random)

# now you can do the same here for the random intercept an random slopes models.

Task: modify the R chunk above and use DIC of the four models to decide whic model is most appropriate to the data.

LS0tCnRpdGxlOiAiTGluZWFyIE1vZGVsIGluIEpBR1MiCm91dHB1dDogaHRtbF9ub3RlYm9vawpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCi0tLQoKQmVmb3JlIHdvcmtpbmcgd2l0aCB0aGUgcGFja2FnZSBgcmphZ3NgIHlvdSB3aWxsIG5lZWQgdG8gc2VwYXJhdGVseSBpbnN0YWxsIFtKQUdTXShodHRwOi8vbWNtYy1qYWdzLnNvdXJjZWZvcmdlLm5ldCkuCgpJbiB0aGlzIGV4YW1wbGUsIHdlIGJ1aWxkIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwsIGFuZCBpbmNsdWRlIHRvIGZpbmlzaCwgYWRkIGEgcmFuZG9tIGVmZmVjdC4gTW9kZWxzIGFyZSBydW4gaW4gSkFHUy4KCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHJqYWdzKQoKIyBsb2FkIGxtZTQgb25seSB0byBhY2Nlc3MgdGhlIGRhdGFzZXQKIyBXZSBjb3VsZCBqdXN0IGFkZHJlc3MgaXQgbG9uZyBoYW5kIHZpYSBsbWU0OjpzbGVlcHN0dWR5IGJ1dCBpbSBiZWluZyBsYXp5LgpsaWJyYXJ5KGxtZTQpCgpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKCiMjIFNsZWVwc3R1ZHkgZGF0YXNldAoKV2Ugd2lsbCB1c2UgdGhlICdzbGVlcHN0dWR5JyBkYXRhc2V0IGZyb20gdGhlIHBhY2thZ2UgYGxtZTRgIHdoaWNoIG1hdGNoZXMgdGhlIHNpbXBsZSBsaW5lYXIgZWZmZWN0cyBtb2RlbCB3aXRoIGEgcmFuZG9tIGVmZmVjdCBpbiB0aGUgZXhhbXBsZSBmb3IgdGhlIGdlbmVyYWwgbGluZWFyIG1peGVkIGVmZmVjdHMgZml0dGluZyBmdW5jdGlvbiBgP2xtZTQ6OmxtZXJgLgoKRnJvbSB0aGUgaGVscCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBgP3NsZWVwc3R1ZHlgOiBUaGUgYXZlcmFnZSByZWFjdGlvbiB0aW1lIHBlciBkYXkgZm9yIHN1YmplY3RzIGluIGEgc2xlZXAgZGVwcml2YXRpb24gc3R1ZHkuIE9uIGRheSAwIHRoZSBzdWJqZWN0cyBoYWQgdGhlaXIgbm9ybWFsIGFtb3VudCBvZiBzbGVlcC4gU3RhcnRpbmcgdGhhdCBuaWdodCB0aGV5IHdlcmUgcmVzdHJpY3RlZCB0byAzIGhvdXJzIG9mIHNsZWVwIHBlciBuaWdodC4gVGhlIG9ic2VydmF0aW9ucyByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgcmVhY3Rpb24gdGltZSBvbiBhIHNlcmllcyBvZiB0ZXN0cyBnaXZlbiBlYWNoIGRheSB0byBlYWNoIHN1YmplY3QuCgpVbHRpbWF0ZWx5IHdlIG1pZ2h0IGZpdCBhIG1peGVkIGVmZmVjdHMgbW9kZWwgY29tcHJpc2luZyBhIGxpbmVhciBlZmZlY3Qgb2YgdGhlIHZhcmlhYmxlIGBEYXlzYCBvbiB0aGUgYXZlcmFnZSBgUmVhY3Rpb25gIHRpbWUsIHdpdGggYSByYW5kb20gZWZmZWN0IGZvciBlYWNoIGBTdWJqZWN0YCBidXQgd2Ugd2lsbCBidWlsZCB0b3dhcmQgdGhpcyBncmFkdWFsbHkuIFdoaWxlIGl0IG1pZ2h0IGJlIHRlbXB0aW5nIHRvIHN0YXJ0IHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBhbmQgYWRkIGluIHRoZSByYW5kb20gZWZmZWN0IGFmdGVyd2FyZHMsIEkgdGhpbmsgaXQgaXMgY29uY2VwdHVhbGx5IGVhc2llciB0byB1bmRlcnN0YW5kIHRoZSByYW5kb20gZWZmZWN0IGlmIHdlIHN0YXJ0IGJ5IGJ1aWxkaW5nIGEgdmFyaWFuY2UgY29tcG9uZW50cyBtb2RlbCB3aGljaCBpcyBlc3NlbnRpYWxseSBhIGhpZXJhcmNoaWNhbCBtb2RlbCB3aXRoIGEgZ3JhbmQgbWVhbiBhbmQgYSBzZXQgb2YgbmVzdGVkIHZhcmlhbmNlcy4gV2UgY2FuIHRoZW4gZWFzaWx5IGFkZCBpbiB0aGUgbGluZWFyIHBhcnQgYWZ0ZXJ3YXJkcy4KCkJ1dCBmaXJzdC4uLiBsZXRzIGJ1aWxkIHRoZSBiYXNpYyBtb2RlbCB0aGF0IGlzIGp1c3QgYSBzaW5nbGUgZ3JhbmQgbWVhbiBhbmQgYSBzaW5nbGUgZXJyb3IgdGVybS4gV2UgbWlnaHQgY2FsbCB0aGlzIG91ciBOdWxsIE1vZGVsIHNpbmNlIGl0IHJlYWxseSBpcyBhcyBzaW1wbGUgYXMgd2UgY2FuIGdldCBhbmQgaWYgd2UgY2FudCBpbXByb3ZlIG9uIHRoaXMgbW9kZWwgdGhlbiB3ZSBjYW50IHJlYWxseSBzYXkgYW55dGhpbmcgYWJvdXQgd2hhdCBpcyBhZmZlY3RpbmcgcmVhY3Rpb24gdGltZXMgb3RoZXIgdGhhbiBpdCBoYXMgYSBudW1iZXIgYW5kIGV2ZXJ5b25lIHZhcmllcyBhcm91bmQgdGhhdCBudW1iZXIgcmFuZG9tbHkuCgojIyBBIG51bGwgbW9kZWwKClRoaXMgbW9kZWwgYmFzaWNhbGx5IGNvbXByaXNlcyBhIG1lYW4gYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIGFuZCBzbyB3ZSBjb3VsZCB2aXN1YWxpc2Ugb3VyIGRhdGEgKmEgcHJpb3JpKiBhcyBlaXRoZXIgYSBoaXN0b2dyYW0sIG9yIGFzIGEgYm94cGxvdCwgb3IgYXMgYW4gZXJyb3JiYXIgcGxvdC4KCmBgYHtyIHZpc3VhbGlzZS1udWxsfQojIGNyZWF0ZSBhIGhpc3RvZ3JhbSBvZiB0aGUgUmVhY2lvbiB0aW1lIGRhdGEsIGFuZCBhZGQgc29tZSBleHRyYQojIHdoaXRlIHNwYWNlIGFib3ZlIHRvIGFsbG93IHVzIGFkZCBhbiBlcnJvciBiYXIgcGxvdCB0byByZXByZXNlbnQgdGhlIAojIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbi4KaGlzdChzbGVlcHN0dWR5JFJlYWN0aW9uLCBicmVha3MgPSAxMCwgeWxpbSA9IGMoMCwgMzUpKQoKIyBhZGQgYSBwb2ludCBhbmQgdGV4dCBmb3IgdGhlIG1lYW4KbXUgPC0gbWVhbihzbGVlcHN0dWR5JFJlYWN0aW9uKQpwb2ludHMobXUsIDMwLCBwY2ggPSAyMCkKdGV4dChtdSwgMzMsIGxhYmVscyA9IHJvdW5kKG11KSkKCiMgYWRkIGEgaG9yaXpvbnRhbCBsaW5lIGZvciB0aGUgKy8tIHNkCnNzIDwtIHNkKHNsZWVwc3R1ZHkkUmVhY3Rpb24pCmxpbmVzKGMobXUgLSBzcywgbXUgKyBzcyksIGMoMzAsIDMwKSwgY29sID0gImJsYWNrIikKCmBgYAoKCkZpcnN0IHdlIGRlZmluZSBvdXIgbW9kZWwgYXMgYSBzdHJpbmcgZm9yIEpBR1MuCmBgYHtyIGRlZmluZS1udWxsLW1vZGVsfQoKIyBEZWZpbmUgb3VyIG1vZGVsCm1vZGVsc3RyaW5nIDwtICcKICBtb2RlbCB7CiAgICAjIExpa2VsaWhvb2QKICAgIGZvciAoaSBpbiAxOk4pewoKICAgICAgWVtpXSB+IGRub3JtKG11W2ldLCB0YXUpCiAgICAgIG11W2ldIDwtIGIwCgogICAgfQogICAgCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBQcmlvcnMKCiAgICAjIHByaW9yIG9uIHRoZSBpbnRlcmNlcHQgLyBncmFuZCBtZWFuCiAgICBiMCB+IGRub3JtKDAsIDEwMCBeIC0yKQoKICAgICMgcHJpb3Igb24gdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgZXJyb3IgdGVybQogICAgIyB3aGljaCBpcyB0aGVuIGNvbnZlcnRlZCB0byBwcmVjaXNpb24uCiAgICBzaWdtYSB+IGR1bmlmKDAsIDEwMCkKICAgIHRhdSA8LSAxIC8gKHNpZ21hIF4gMikgCiAgfQonCgpgYGAKCk5vdyB3ZSBuZWVkIHRvIGJ1bmRsZSB1cCBvdXIgZGF0YSBhbmQgcGFzcyBpdCB0byByamFncyBmb3IgZml0dGluZy4KCmBgYHtyIHJ1bi1udWxsLW1vZGVsfQoKIyBTZXQgdXAgZGF0YQpkYXRhID0gbGlzdCggTiA9IG5yb3coc2xlZXBzdHVkeSksCiAgICAgICAgICAgICBZID0gc2xlZXBzdHVkeSRSZWFjdGlvbikKCiMgb3BlbiBhIHRleHQgY29ubmVjdGlvbiBmb3Igb3VyIG1vZGVsc3RyaW5nLiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIAojIGNyZWF0aW5nIGEgZmlsZSB0aGF0IGRvZXNudCBleGlzdCBvbiBvdXIgZHJpdmVzIGFzIHdlIGNvbnNpZGVyIGEgKi50eHQgZmlsZSAKIyB0byBleGlzdCwgYnV0IGVzc2VudGlhbGx5IHRoZSBjb21wdXRlciB0aGVuIHRyZWF0cyB0aGVtIHRoZSBzYW1lLgptb2RlbF9jb25uZWN0aW9uIDwtIHRleHRDb25uZWN0aW9uKG1vZGVsc3RyaW5nKQoKIyBSdW4gamFncwptb2RlbF9udWxsIDwtIGphZ3MubW9kZWwobW9kZWxfY29ubmVjdGlvbiwgZGF0YSA9IGRhdGEsIAogICAgICAgICAgICAgICAgIG4uY2hhaW5zID0gMywgcXVpZXQgPSBUUlVFKQoKIyB3ZSBzaG91bGQgdGhlbiBjbG9zZSBvdXIgdGV4dCBjb25uZWN0aW9uIHRoYXQgd2UgbWFkZQpjbG9zZShtb2RlbF9jb25uZWN0aW9uKQoKb3V0cHV0IDwtIGNvZGEuc2FtcGxlcyhtb2RlbCA9IG1vZGVsX251bGwsCiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZXM9YygiYjAiLCAic2lnbWEiKSwgCiAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gNTAwMCwKICAgICAgICAgICAgICAgICAgICB0aGluID0gNSkKCmBgYAoKKipfVGFza3M6XyoqIGNoZWNrIHRoYXQgdGhlIHByZWRpY3Rpb25zIGZyb20gb3VyIEJheWVzaWFuIG1vZGVsIG1hdGNoIHRoZSBzaW1wbGUgbWF4aW11bSBsaWtlbGlob29kIGNhbGN1bGF0aW9ucyBvZiB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByZWFjdGlvbiB0aW1lcy4KCiMjIFZhcmlhbmNlIENvbXBvbmVudHMgbW9kZWwgLSBhZGRpbmcgdGhlIHJhbmRvbSBlZmZlY3QKCldlIG1heSB3ZWxsIHJlY29nbmlzZSB0aGF0IHRoZXJlIGlzIHZhcmlhdGlvbiBib3RoIHdpdGhpbiBhbmQgYW1vbmcgaW5kaXZpZHVhbCBTdWJqZWN0cy4gRm9yIG9uZSwgaWRlbnRpZnlpbmcgd2hlcmUgdGhlIG1ham9yaXR5IG9mIHRoaXMgdmFyaWF0aW9uIGlzIHdvdWxkIGJlIG9mIGludGVyZXN0IGluIHRlcm1zIG9mIGRpcmVjdGluZyBmdXR1cmUgZWZmb3J0cyBlaXRoZXIgdG8gZmluZGluZyBleHBsYW5hdG9yeSB2YXJpYWJsZXMgd2l0aGluIG9yIGFtb25nIGluZGl2aWR1YWxzLiBGcm9tIGEgc3RhdGlzdGljYWwgcGVyc3BlY3RpdmUsIGl0IGlzIHZpdGFsIHRvIGNvbnRyb2wgZm9yIHRoaXMgdmFyaWF0aW9uIHdoZW4gdGVzdGluZyBhbW9uZyBpbmRpdmlkdWFsIGVmZmVjdHMsIGFzIG90aGVyd2lzZSBvdXIgY2FsY3VsYXRpb25zIG9mIHBvd2VyIGFuZCBoZW5jZSBlZmZlY3Qgc2l6ZSBhbmQgc2lnbmlmaWNhbmNlIGNhbiBiZSAodmVyeSBmYXIpIG9mZi4KCiMjIyBWaXN1YWxpc2UgdmFyaWF0aW9uIHdpdGhpbiBhbmQgYW1vbmcgc3ViamVjdHMKCmBgYHtyIHZpc3VhbGlzZS12YXJpYXRpb259CgojIGNyZWF0ZSBhIGJveHBsb3Qgb2YgdGhlIFJlYWN0aW9uIHRpbWUgZGF0YSBicm9rZW4gZG93biBieSBTdWJqZWN0LgojIEFkZCBob3Jpem9udGFsIGxpbmVzIGZvciB0ZWggZ3JhbmQgbWVhbiAobXUpIGFuZCBncmFuZCBzdGFuZGFyZCBkZXZpYXRpb24gKHNzKQojIHdoaWNoIHdlIGNyZWF0ZWQgZWFybGllciBpbiBvdXIgZmlyc3QgcGxvdCBvZiB0aGUgbnVsbCBtb2RlbC4KZzEgPC0gZ2dwbG90KHNsZWVwc3R1ZHksIGFlcyh4ID0gU3ViamVjdCwgeSA9IFJlYWN0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIGdlb21fYWJsaW5lKG1hcHBpbmcgPSBhZXMoaW50ZXJjZXB0ID0gbXUsIHNsb3BlID0gMCksIGNvbCA9ICJyZWQiKSArIAogIGdlb21fYWJsaW5lKG1hcHBpbmcgPSBhZXMoaW50ZXJjZXB0ID0gbXUgLSBzcywgc2xvcGUgPSAwKSwgCiAgICAgICAgICAgICAgY29sID0gInJlZCIsIGxpbmV0eXBlID0gMikgKyAKICBnZW9tX2FibGluZShtYXBwaW5nID0gYWVzKGludGVyY2VwdCA9IG11ICsgc3MsIHNsb3BlID0gMCksIAogICAgICAgICAgICAgIGNvbCA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpCgojIHByaW50IHRoaXMgZmlndXJlIHRvIHNjcmVlbgpwcmludChnMSkKCmBgYApDbGVhcmx5IHRoZXJlIGlzIGNvbnNpZGVyYWJsZSB2YXJpYXRpb24gd2l0aGluIHN1YmplY3RzLCB3aXRoIHNvbWUgaW5kaXZpZHVhbHMgYmVpbmcgdmVyeSBtdWNoIGxvd2VyIHRoYW4gdGhlIG92ZXJhbGwgbWVhbiwgYW5kIG90aGVycyBtdWNoIGhpZ2hlci4gVGhlcmUgYXBwZWFycyBhdCBsZWFzdCBieSBleWUsIGZvciB0aGVyZSB0byBiZSBtb3JlIHZhcmlhdGlvbiBhbW9uZyBpbmRpdmlkdWFscyB0aGFuIHdpdGhpbiwgd2hlcmUgcmVhY3Rpb24gdGltZXMgYnkgaW5kaXZpZHVhbCBzZWVtIHRvIGJlIHJlYXNvbmFibHkgY29uc2lzdGVudCB3aXRoIGEgZmV3IGV4Y2VwdGlvbnMuIEJlYXIgaW4gbWluZCB0aGVyZSBpcyBhZGRpdGlvbmFsIGRhdGEgaW4gdGhlIGZvcm0gb2YgYSBsaW5lYXIgZWZmZWN0IHZhcmlhYmxlIG9mIHRoZSBleHBlcmltZW50YWxseSBtYW5pcHVsYXRlZCBhbW91bnQgb2Ygc2xlZXAgZWFjaCBzdWJqZWN0IHJlY2VpdmVkIHByaW9yIHRvIHRlc3RpbmcsIGFuZCB0aGlzIG1heSBoZWxwIGZ1cnRoZXIgZXhwbGFpbiB0aGUgdmFyaWF0aW9uIHdlIG9ic2VydmUuCgoKIyMjIEJ1aWxkIG91ciBoaWVyYXJjaGljYWwgbW9kZWwgb2YgdmFyaWFuY2VzCgpUaGUgcmFuZG9tIGVmZmVjdCBpbiB0aGlzIGV4YW1wbGUgaXMgYnkgKlN1YmplY3QqLCB3aXRoIG11bHRpcGxlIG9ic2VydmF0aW9ucyBtYWRlIG9uIHRoZSBzYW1lIHN1YmplY3QuIEluIHRoaXMgc2ltcGxlIHJhbmRvbSBpbnRlcmNlcHQgbW9kZWwsIHdlIHdhbnQgdG8gYWxsb3cgaW5kaXZpZHVhbHMgdG8gZGlmZmVyIGZyb20gdGhlaXIgZXhwZWN0ZWQgdmFsdWUgKHRoZSBpbnRlcmNlcHQpIGJ5IGEgKGhvcGVmdWxseSByZWxhdGl2ZWx5KSBzbWFsbCBkZXZpYXRpb24uIFRoZSBtZWFuIG9mIGVhY2ggaW5kaXZpZHVhbHMnIGRldmlhdGlvbnMgd2lsbCBiZSBkZXNjcmliZWQgYnkgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCBhbmQgYnkgYSB2YXJpYWJsZSAkVVtqXSQgZm9yIHRoZSBqdGggaW5kaXZpZHVhbCBkZXNjcmliZWQgYnkgJFVfaiBcc2ltIE4oMCwgXHNpZ21hXjJfVSkkLgoKV2UgZGVmaW5lIGEgbmV3IGphZ3MgbW9kZWwKCmBgYHtyIHJhbmRvbS1qYWdzfQojIERlZmluZSBvdXIgbW9kZWwKbW9kZWxzdHJpbmcgPC0gJwogIG1vZGVsIHsKICAgICMgTGlrZWxpaG9vZAogICAgZm9yIChpIGluIDE6Til7CgogICAgICBZW2ldIH4gZG5vcm0obXVbaV0sIHRhdSkKCiAgICAgICMgVGhlIGNvZGUgVVtTdWJqZWN0W2ldXSBsb29rcyB1cCB0aGUgc3ViamVjdCBpZGVudGlmaWVyIGZvciB0aGUgaXRoIAogICAgICAjIGluZGl2aWR1YWwgYW5kIGV4dHJhY3RzIHRoZSBjb3JyZXNwb25kaW5nIGRldmlhdGlvbiBmcm9tIFUgd2hpY2ggCiAgICAgICMgaXMgZGVmaW5lZCBhZnRlciB0aGUgbG9vcCBvdmVyIGkuCiAgICAgIG11W2ldIDwtIGIwICsgVVtTdWJqZWN0W2ldXQoKICAgIH0KCiAgICAjIHJhbmRvbSBwYXJ0cwogICAgIwogICAgIyBQdWxsIG91dCB0aGUgcmFuZG9tIGRldmlhdGlvbnMgZm9yIHRoZSB2YXJpYWJsZSBVLCBvbmUgZm9yIGVhY2ggCiAgICAjIHN1YmplY3QKICAgIGZvciAoaiBpbiAxOlMpewogICAgICBVW2pdIH4gZG5vcm0oMCwgdGF1X1UpCiAgICB9CgogICAgIyB3ZSBjYW4gaWYgd2Ugd2FudCBjYWxjbHVhdGUgdGhlIHRvdGFsIHZhcmlhbmNlLCB3aGljaCBpcyB0aGUgc2ltcGxlIAogICAgIyBzdW0gb2YgdmFyaWFuY2VzLiBXZSB3b3VsZCBuZWVkIHRvIG1vbml0b3IgdGhpcyB2YXJpYWJsZSBpZiB3ZSB3YW50IHRvIAogICAgIyBzZWUgaXQuIFJlbWVtYmVyOiB3aGlsZSB2YXJpYW5jZXMgYXJlIGFkZGl0aXZlLCBuZWl0aGVyIAogICAgIyBzdGFuZGFyZCBkZXZpYXRpb25zIG5vciBwcmVjaXNpb25zIGFyZS4KICAgIHZhcl90b3QgPC0gKHNpZ21hX1UgXiAyKSArIChzaWdtYSBeIDIpCiAgICAKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFByaW9ycwogICAgCiAgICAjIHByaW9yIG9uIHRoZSBncmFuZCBtZWFuIGIwIChzYW1lIGFzIHRoZSBpbnRlcmNlcHQpCiAgICBiMCB+IGRub3JtKDAsIDEwMCBeIC0yKQogICAgCiAgICAjIHByaW9yIG9uIHRoZSByZXNpZHVhbCBlcnJvciB0ZXJtbgogICAgc2lnbWEgfiBkdW5pZigwLCAxMDApCiAgICB0YXUgPC0gMSAvIChzaWdtYSBeIDIpIAoKICAgICMgcHJpb3Igb24gdGhlIFN1YmplY3QgbGV2ZWwgZXJyb3IgdGVybQogICAgc2lnbWFfVSB+IGR1bmlmKDAsIDEwMCkKICAgIHRhdV9VIDwtIDEgLyAoc2lnbWFfVSBeIDIpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIH0KJwoKYGBgCgpOb3cgcGFzcyBvbiB0aGUgYWRkaXRpb25hbCBkYXRhIHdoaWNoIGlzICRTJCB0aGUgbnVtYmVyIG9mIHN1YmplY3RzIGluIHRoZSBkYXRhc2V0LCBhbmQgJFN1YmplY3QkIHdoaWNoIGlzIHRoZSBjb2x1bW4gU3ViamVjdCBpbiB0aGUgZGF0YXNldC4gCgojIyMgVGhpcyBzdGVwIGlzIHJlYWxseSBpbXBvcnRhbnQgaW4gdGhpcyBleGFtcGxlClRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY29udmVydCB0aGlzIGZhY3RvciBsYWJlbGxlZCBjb2x1bW4gd2hpY2ggc3RhcnRzIGF0IHN1YmplY3QgMzA4IGFuZCBydW5zIHRvIDM3MiwgaW50byBhIHNlcXVlbmNlIHN0YXJ0aW5nIGF0IDEgYW5kIHJ1bm5pbmcgdG8gMTg6IHRoaXMgaXMgYWNoZWl2ZWQgZWFzaWx5IGJ5IHVzaW5nIGBhcy5udW1lcmljKHNsZWVwc3R1ZHkkU3ViamVjdClgLgoKYGBge3IgZml0LXJhbmRvbX0KIyBTZXQgdXAgZGF0YQpkYXRhIDwtIGxpc3QoIE4gPSBucm93KHNsZWVwc3R1ZHkpLCAKICAgICAgICAgICAgICBTID0gbGVuZ3RoKGxldmVscyhzbGVlcHN0dWR5JFN1YmplY3QpKSwKICAgICAgICAgICAgICBTdWJqZWN0ID0gYXMubnVtZXJpYyhzbGVlcHN0dWR5JFN1YmplY3QpLAogICAgICAgICAgICAgIFkgPSBzbGVlcHN0dWR5JFJlYWN0aW9uKQoKIyBvcGVuIGEgdGV4dCBjb25uZWN0aW9uIGZvciBvdXIgbW9kZWxzdHJpbmcuCm1vZGVsX2Nvbm5lY3Rpb24gPC0gdGV4dENvbm5lY3Rpb24obW9kZWxzdHJpbmcpCgojIFJ1biBqYWdzCm1vZGVsX3JhbmRvbSA8LSBqYWdzLm1vZGVsKG1vZGVsX2Nvbm5lY3Rpb24sIGRhdGEgPSBkYXRhLCAKICAgICAgICAgICAgICAgICBuLmNoYWlucyA9IDMsIHF1aWV0ID0gVFJVRSkKCiMgd2Ugc2hvdWxkIHRoZW4gY2xvc2Ugb3VyIHRleHQgY29ubmVjdGlvbiB0aGF0IHdlIG1hZGUKY2xvc2UobW9kZWxfY29ubmVjdGlvbikKCm91dHB1dCA8LSBjb2RhLnNhbXBsZXMobW9kZWwgPSBtb2RlbF9yYW5kb20sCiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZXM9YygiYjAiLCAic2lnbWEiLCAic2lnbWFfVSIpLCAKICAgICAgICAgICAgICAgICAgICBuLml0ZXIgPSA1MDAwLAogICAgICAgICAgICAgICAgICAgIHRoaW4gPSA1KQoKCmBgYAoKQW5kIHBsb3QgdGhlIG91dHB1dApgYGB7ciBwbG90LXJhbmRvbX0KIyBQbG90IG91dHB1dApwbG90KG91dHB1dCkKCmBgYAoKKipfVGFza3M6XyoqIFdlIGNvdWxkIGlmIHdlIHdhbnRlZCwgbW9uaXRvciB0aGUgdmFyaWFibGUgYFVgIHdoaWNoIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIGphZ3MgbW9kZWwgd2Ugc3BlY2lmaWVkLiBUaGlzIHdvdWxkIGdpdmUgdXMgdGhlIHN1YmplY3QgbGV2ZWwgZWZmZWN0cyBhcm91bmQgdGhlIGludGVyY2VwdCAod2hpY2ggaW4gdGhpcyB0eXBlIG9mIG1vZGVsIGlzIHRoZSBnbG9iYWwgbWVhbikuIElmIHdlIGRvIHRoaXMsIHdoYXQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBkbyB3ZSBub3cgZ2V0IGluIHRoZSBgb3V0cHV0YCBvYmplY3Q/IFdoYXQgbWlnaHQgd2UgZG8gdG8gY29uZGVuc2UgdGhpcyBpbmZvcm1hdGlvbiBhbmQgbWFrZSBzZW5zZSBvZiBpdD8KCgojIyBBZGRpbmcgdGhlIGxpbmVhciBlZmZlY3QKCkFkZGluZyBhIGxpbmVhciBlZmZlY3Qgb2YgYERheXNgIG9mIHNsZWVwIGRlcHJpdmF0aW9uIG5vdyBjcmVhdGVzIHdoYXQgbWFueSBtaWdodCBjYWxsIGEgbWl4ZWQgZWZmZWN0cyBtb2RlbC4gUmVhbGx5IHdlIGFyZSBqdXN0IGV4dGVuZGluZyBvdXIgbW9kZWwgd2l0aGluIHRoZSBmcmFtZXdvcmsgb2YgR2VuZXJhbCBMaW5lYXIgTW9kZWxzIGFuZCBwZXJzb25hbGx5IEkgZmluZCBtdWNoIG9mIHRoZSBub21lbmNsYXR1cmUgYXJvdW5kIHNwZWNpZmljIHN1YnNldHMgb2YgbW9kZWxzIHRvIGJlIHVuaGVsZnVsIChhbmQgSSBpbmNsdWRlIHZhcmlhbmNlIGNvbXBvbmVudHMgaW4gdGhpcykuCgpXZSBkZWZpbmUgYSBuZXcgamFncyBtb2RlbCB0aGF0IGFkZHMgYSBsaW5lYXIgZWZmZWN0IG9mIGBEYXlzYDogJGJfMSAqIFx0ZXh0e0RheXN9JCBhbmQgd2UgcmVtZW1iZXIgdG8gc3BlY2lmeSBhIHByaW9yIGZvciB0aGlzIHVua25vd24gcGFyYW1ldGVyICRiXzEkLgoKYGBge3IgcmFuZG9tLWludGVyY2VwdHMtamFnc30KIyBEZWZpbmUgb3VyIG1vZGVsCm1vZGVsc3RyaW5nIDwtICcKICBtb2RlbCB7CiAgICAjIExpa2VsaWhvb2QKICAgIGZvciAoaSBpbiAxOk4pewoKICAgICAgWVtpXSB+IGRub3JtKG11W2ldLCB0YXUpCgogICAgICAjIFRoZSBjb2RlIFVbU3ViamVjdFtpXV0gbG9va3MgdXAgdGhlIHN1YmplY3QgaWRlbnRpZmllciBmb3IgdGhlIGl0aCAKICAgICAgIyBpbmRpdmlkdWFsIGFuZCBleHRyYWN0cyB0aGUgY29ycmVzcG9uZGluZyBkZXZpYXRpb24gZnJvbSBVIHdoaWNoIAogICAgICAjIGlzIGRlZmluZWQgYWZ0ZXIgdGhlIGxvb3Agb3ZlciBpLgogICAgICBtdVtpXSA8LSBiMCArIGIxICogWFtpXSArIFVbU3ViamVjdFtpXV0KCiAgICB9CgogICAgIyByYW5kb20gcGFydHMKICAgICMKICAgICMgUHVsbCBvdXQgdGhlIHJhbmRvbSBkZXZpYXRpb25zIGZvciB0aGUgdmFyaWFibGUgVSwgb25lIGZvciBlYWNoIAogICAgIyBzdWJqZWN0CiAgICBmb3IgKGogaW4gMTpTKXsKICAgICAgVVtqXSB+IGRub3JtKDAsIHRhdV9VKQogICAgfQogICAgCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBQcmlvcnMKICAgIAogICAgIyBwcmlvciBvbiB0aGUgZ3JhbmQgbWVhbiBiMCAoc2FtZSBhcyB0aGUgaW50ZXJjZXB0KQogICAgYjAgfiBkbm9ybSgwLCAxMDAgXiAtMikKCiAgICAjIHByaW9yIG9uIHRoZSBzbG9wZSBvZiB0aGUgZWZmZWN0IG9mIERheXMKICAgIGIxIH4gZG5vcm0oMCwgMTAwIF4gLTIpCiAgICAKICAgICMgcHJpb3Igb24gdGhlIHJlc2lkdWFsIGVycm9yIHRlcm1uCiAgICBzaWdtYSB+IGR1bmlmKDAsIDEwMCkKICAgIHRhdSA8LSAxIC8gKHNpZ21hIF4gMikgCgogICAgIyBwcmlvciBvbiB0aGUgU3ViamVjdCBsZXZlbCBlcnJvciB0ZXJtCiAgICBzaWdtYV9VIH4gZHVuaWYoMCwgMTAwKQogICAgdGF1X1UgPC0gMSAvIChzaWdtYV9VIF4gMikKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgfQonCgpgYGAKCgoKYGBge3IgZml0LXJhbmRvbS1pbnRlcmNlcHRzfQojIFNldCB1cCBkYXRhCmRhdGEgPC0gbGlzdCggTiA9IG5yb3coc2xlZXBzdHVkeSksIAogICAgICAgICAgICAgIFMgPSBsZW5ndGgobGV2ZWxzKHNsZWVwc3R1ZHkkU3ViamVjdCkpLAogICAgICAgICAgICAgIFN1YmplY3QgPSBhcy5udW1lcmljKHNsZWVwc3R1ZHkkU3ViamVjdCksCiAgICAgICAgICAgICAgWCA9ICBzbGVlcHN0dWR5JERheXMsCiAgICAgICAgICAgICAgWSA9IHNsZWVwc3R1ZHkkUmVhY3Rpb24pCgojIG9wZW4gYSB0ZXh0IGNvbm5lY3Rpb24gZm9yIG91ciBtb2RlbHN0cmluZy4KbW9kZWxfY29ubmVjdGlvbiA8LSB0ZXh0Q29ubmVjdGlvbihtb2RlbHN0cmluZykKCiMgUnVuIGphZ3MKbW9kZWxfcmFuZF9pbnQgPC0gamFncy5tb2RlbChtb2RlbF9jb25uZWN0aW9uLCBkYXRhID0gZGF0YSwgCiAgICAgICAgICAgICAgICAgbi5jaGFpbnMgPSAzLCBxdWlldCA9IFRSVUUpCgojIHdlIHNob3VsZCB0aGVuIGNsb3NlIG91ciB0ZXh0IGNvbm5lY3Rpb24gdGhhdCB3ZSBtYWRlCmNsb3NlKG1vZGVsX2Nvbm5lY3Rpb24pCgpvdXRwdXQgPC0gY29kYS5zYW1wbGVzKG1vZGVsPW1vZGVsX3JhbmRfaW50LAogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWVzPWMoImIwIiwgImIxIiwgInNpZ21hIiwgInNpZ21hX1UiKSwgCiAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gNTAwMCwKICAgICAgICAgICAgICAgICAgICB0aGluID0gNSkKCgpgYGAKCkFuZCBwbG90IGFuZCBleHBsb3JlIHRoZSBvdXRwdXQKYGBge3IgcGxvdC1yYW5kb20taW50ZXJjZXB0c30KCiMgc3VtbWFyaWVzIG9mIHRoZSBwb3N0ZXJpb3JzCnN1bW1hcnkob3V0cHV0KQoKIyBQbG90IG91dHB1dApwbG90KG91dHB1dCkKCmBgYAoKIyMgRnVydGhlciBleHRlbmRpbmcgdGhpcyB0byByYW5kb20gc2xvcGVzCgpUaGUgbW9kZWwgYWJvdmUgaXMgdGVjaG5pY2FsbHkgYSByYW5kb20gaW50ZXJjZXB0IG1vZGVsIHNpbmNlIG9ubHkgdGhlIGludGVyY2VwdHMgZm9yIGVhY2ggU3ViamVjdCB2YXJ5IGFuZCBlYWNoIGluZGl2aWR1YWwgc3ViamVjdCBzaGFyZXMgdGhlIHNhbWUgb3ZlcmFsbCBlZmZlY3Qgb2YgZGF5cyBvZiBzbGVlcCBkZXByaXZhdGlvbiBvbiB0aGVpciByZWFjdGlvbiB0aW1lLiBTaW5jZSB3ZSBjYW4gYnVpbGQgYW55IG1vZGVsIHdlIGxpa2UgaW4gdGhlIEJheWVzaWFuIGZyYW1ld29yayB3ZSBjYW4gcmVhc29uYWJseSBlYXNpbHkgZXh0ZW5kIG91ciBtb2RlbCB0byBhbGxvdyBib3RoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCByYW5kb20gc2xvcGVzIGJ5IGluZGl2aWR1YWwuCgojIyMgVmlzdWFsbHkgdGhpcyBtaWdodCBsb29rIGxpa2UgdGhpczoKCmBgYHtyIHZpc3VhbGlzZS1yYW5kb20tc2xvcGVzfQoKIyBwbG90IFJlYWN0aW9uIHRpbWUgYnkgRGF5cyBvZiBzbGVlcCBkZXByaXZhdGlvbiBhbmQgY29sb3VyIGJ5IFN1YmplY3QuCiMgdXNlIGdlb21fc21vb3RoKCkgdG8gYWRkIGxpbmVhciBlc3RpbWF0ZXMgZm9yIGVhY2ggc3ViamVjdCwgYW5kIAojIHN1cHByZXNzIHRoZSBlcnJvciBiYXJzIGVsc2UgdGhlIHBsb3QgZ2V0cyBjb25mdXNpbmcKZzMgPC0gZ2dwbG90KHNsZWVwc3R1ZHksIGFlcyh4ID0gRGF5cywgeSA9IFJlYWN0aW9uLCBjb2wgPSBTdWJqZWN0KSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgc2UgPSBGQUxTRSkKCiMgcHJpbnQgdGhpcyBmaWd1cmUgdG8gc2NyZWVuCnByaW50KGczKQoKYGBgCiMjIyBCdWlsZCBhbmQgZml0IG91ciByYW5kb20gc2xvcGVzIG1vZGVsCgoqKl9UYXNrOl8qKiBCZWZvcmUgd2Ugc3RhcnQgY29kaW5nOyBob3cgbWFueSBzbG9wZXMgZG8gd2UgbmVlZCB0byBlc2ltYXRlPyBpLmUuIGhvdyBtYW55IGpzIGluICRiX3sxfVtqXSQgZG8gd2UgbmVlZD8gCgpTaW5jZSB3ZSB3aWxsIGJlIGRyYXdpbmcgb3VyICRiXzEkcyBmcm9tIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyB3ZSBkaWQgZm9yIHRoZSBpbnRlcmNlcHRzLCB3ZSB3aWxsIG5lZWQgdG8gc3BlY2lmeSBhIHByaW9yIGZvciBib3RoIHRoZSBtZWFuIGFuZCB0aGUgdmFyaWFuY2UgZm9yIHRoaXMgZGlzdHJpYnV0aW9uLgoKV2UgdGhlcmVmb3JlIG5vdyBoYXZlIHRocmVlIHJhbmRvbSB0ZXJtczogcmVzaWR1YWwgZXJyb3IsIGVycm9yIGFtb25nIHRoZSBzdWJqZWN0cycgaW50ZXJjZXB0cyBhbmQgZXJyb3IgYW1vbmcgdGhlIHN1YmplY3RzJyByZXNwb25zZSB0byBzbGVlcCBkZXByaXZhdGlvbi4KCmBgYHtyIHJhbmRvbS1zbG9wZXMtamFnc30KIyBEZWZpbmUgb3VyIG1vZGVsCm1vZGVsc3RyaW5nIDwtICcKICBtb2RlbCB7CiAgICAjIExpa2VsaWhvb2QKICAgIGZvciAoaSBpbiAxOk4pewoKICAgICAgWVtpXSB+IGRub3JtKG11W2ldLCB0YXUpCgogICAgICAjIFRoZSBjb2RlIFVbU3ViamVjdFtpXV0gbG9va3MgdXAgdGhlIHN1YmplY3QgaWRlbnRpZmllciBmb3IgdGhlIGl0aCAKICAgICAgIyBpbmRpdmlkdWFsIGFuZCBleHRyYWN0cyB0aGUgY29ycmVzcG9uZGluZyBkZXZpYXRpb24gZnJvbSBVIHdoaWNoIAogICAgICAjIGlzIGRlZmluZWQgYWZ0ZXIgdGhlIGxvb3Agb3ZlciBpLgogICAgICBtdVtpXSA8LSBiMCArIGIxW1N1YmplY3RbaV1dICogWFtpXSArIFVbU3ViamVjdFtpXV0KCiAgICB9CgogICAgIyByYW5kb20gcGFydHMKICAgICMKICAgICMgUHVsbCBvdXQgdGhlIHJhbmRvbSBkZXZpYXRpb25zIGZvciB0aGUgdmFyaWFibGUgVSwgb25lIGZvciBlYWNoIAogICAgIyBzdWJqZWN0LgogICAgIyBXZSBjYW4gYWxzbyBkcmF3IHRoZSBzbG9wZXMgZm9yIG91ciBpbmRpdmlkdWFsIHN1YmplY3RzCiAgICBmb3IgKGogaW4gMTpTKXsKICAgICAgVVtqXSB+IGRub3JtKDAsIHRhdV9VKQogICAgICBiMVtqXSB+IGRub3JtKG11X2IxLCB0YXVfYjEpCiAgICB9CgogICAgCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBQcmlvcnMKICAgIAogICAgIyBwcmlvciBvbiB0aGUgZ3JhbmQgbWVhbiBiMCAoc2FtZSBhcyB0aGUgaW50ZXJjZXB0KQogICAgYjAgfiBkbm9ybSgwLCAxMDAgXiAtMikKCiAgICAjIHByaW9yIG9uIHRoZSBtZWFuIGFuZCB2YXJpYWJuY2Ugb2Ygc2xvcGUgb2YgdGhlIGVmZmVjdCBvZiBEYXlzCiAgICBtdV9iMSB+IGRub3JtKDAsIDEwMCBeIC0yKQogICAgc2lnbWFfYjEgfiBkdW5pZigwLCAxMDApCiAgICB0YXVfYjEgPC0gMiAvIChzaWdtYV9iMSBeIDIpCiAgICAKICAgICMgcHJpb3Igb24gdGhlIHJlc2lkdWFsIGVycm9yIHRlcm1uCiAgICBzaWdtYSB+IGR1bmlmKDAsIDEwMCkKICAgIHRhdSA8LSAxIC8gKHNpZ21hIF4gMikgCgogICAgIyBwcmlvciBvbiB0aGUgU3ViamVjdCBsZXZlbCBlcnJvciB0ZXJtCiAgICBzaWdtYV9VIH4gZHVuaWYoMCwgMTAwKQogICAgdGF1X1UgPC0gMSAvIChzaWdtYV9VIF4gMikKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgfQonCgpgYGAKCgoKYGBge3IgZml0LXJhbmRvbS1zbG9wZXN9CiMgU2V0IHVwIGRhdGEKZGF0YSA8LSBsaXN0KCBOID0gbnJvdyhzbGVlcHN0dWR5KSwgCiAgICAgICAgICAgICAgUyA9IGxlbmd0aChsZXZlbHMoc2xlZXBzdHVkeSRTdWJqZWN0KSksCiAgICAgICAgICAgICAgU3ViamVjdCA9IGFzLm51bWVyaWMoc2xlZXBzdHVkeSRTdWJqZWN0KSwKICAgICAgICAgICAgICBYID0gIHNsZWVwc3R1ZHkkRGF5cywKICAgICAgICAgICAgICBZID0gc2xlZXBzdHVkeSRSZWFjdGlvbikKCiMgb3BlbiBhIHRleHQgY29ubmVjdGlvbiBmb3Igb3VyIG1vZGVsc3RyaW5nLgptb2RlbF9jb25uZWN0aW9uIDwtIHRleHRDb25uZWN0aW9uKG1vZGVsc3RyaW5nKQoKIyBSdW4gamFncwptb2RlbF9yYW5kX3Nsb3BlcyA8LSBqYWdzLm1vZGVsKG1vZGVsX2Nvbm5lY3Rpb24sIGRhdGEgPSBkYXRhLCAKICAgICAgICAgICAgICAgICBuLmNoYWlucyA9IDMsIHF1aWV0ID0gVFJVRSkKCiMgd2Ugc2hvdWxkIHRoZW4gY2xvc2Ugb3VyIHRleHQgY29ubmVjdGlvbiB0aGF0IHdlIG1hZGUKY2xvc2UobW9kZWxfY29ubmVjdGlvbikKCm91dHB1dCA8LSBjb2RhLnNhbXBsZXMobW9kZWwgPSBtb2RlbF9yYW5kX3Nsb3BlcywKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lcz1jKCJiMCIsICJtdV9iMSIsICJzaWdtYV9iMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ21hIiwgInNpZ21hX1UiKSwgCiAgICAgICAgICAgICAgICAgICAgbi5pdGVyID0gNTAwMCwKICAgICAgICAgICAgICAgICAgICB0aGluID0gNSkKCgpgYGAKCkFuZCBwbG90IHRoZSBvdXRwdXQKYGBge3IgcGxvdC1yYW5kb20tc2xvcGVzfQoKIyBzdW1tYXJpZXMgb2YgdGhlIHBvc3RlcmlvcnMKc3VtbWFyeShvdXRwdXQpCgojIFBsb3Qgb3V0cHV0CnBsb3Qob3V0cHV0KQoKYGBgCgoqKl9UYXNrczpfKiogYXMgYmVmb3JlLCB3ZSBtaWdodCB3YW50IHRvIGV4dHJhY3QgdGhlIGFjdHVhbCBzbG9wZXMgZm9yIGVhY2ggaW5kaXZpZHVhbC4gV2hhdCBwYXJhbWV0ZXIgd291bGQgd2UgYWRkIHRvIG1vbml0b3IgbGlzdCB0byBhY2hlaXZlIHRoaXM/IERvIHRoZXNlIGVzdGltYXRlcyBtYXRjaCB0aGUgdmlzdWFsaXNhdGlvbiBvZiB0aGUgZGF0YSB3ZSBtYWRlIGFib3ZlPwoKIyMgQ29tcGFyaW5nIGFtb25nIG1vZGVscwoKQmF5ZXNpYW4gbW9kZWxzIGhhdmUgRElDIGFzIGFuIGFuYWxvZ3VlIHRvIHRoZSBtYXhpbXVtIGxpa2VsaWhvb2QgZm91bmRlZCBBSUMgc2NvcmVzLCBhbmQgdGhleSB3b3JrIGluIG11Y2ggdGhlIHNhbWUgd2F5OiBsb3dlciBzY29yZXMgaW5kaWNhdGUgaW1wcm92ZWQgbW9kZWwgZml0IGJhbGFuY2VkIGFnYWluc3QgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGludm9sdmVkLiBXZSBjYW4gdXNlIGBkaWMuc2FtcGxlcygpYCB0byBxdWlja2x5IGNhbHVjbGF0ZSB0aGVzZSBzY29yZXMgZm9yIG91ciBmb3VyIG1vZGVscy4gSnVzdCBiZWFyIGluIG1pbmQgdGhhdCBhcyB3aXRoIGZyZXF1ZW50aXN0IG9yIG1heGltdW0gbGlrZWxpaG9vZCBhcHByb2FjaGVzLCBjYWxjdWxhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gcmFuZG9tIGVmZmVjdHMgbW9kZWxzIGNhbiBiZSBjb21wbGljYXRlZCwgYW5kIGluIG1hbnkgaW5zdGFuY2VzIGBkaWMuc2FtcGxlcygpYCBtYXkgbm90IHJ1biBvciBiZSByZWxpYWJsZS4KCkkgaGF2ZSBvcHRlZCBmb3IganVzdCAxMDAwIHNhbXBsZXMgb24gd2hpY2ggdG8gY2FsY3VsYXRlIERJQywgYnV0IHlvdSBtYXkgd2FudCB0byBpbmNyZWFzZSB0aGlzLgoKCmBgYHtyIGRpYy1jb21wYXJpc29ufQoKIyBmaXJzdCB0aGUgbnVsbCBtb2RlbApkaWMuc2FtcGxlcyhtb2RlbF9udWxsKQoKIyB0aGVuIG91ciB0d28gbGV2ZWwgcmFuZG9tIGVmZmVjdHMgbW9kZWwKZGljLnNhbXBsZXMobW9kZWxfcmFuZG9tKQoKIyBub3cgeW91IGNhbiBkbyB0aGUgc2FtZSBoZXJlIGZvciB0aGUgcmFuZG9tIGludGVyY2VwdCBhbiByYW5kb20gc2xvcGVzIG1vZGVscy4KCmBgYAoKCioqX1Rhc2s6XyoqIG1vZGlmeSB0aGUgUiBjaHVuayBhYm92ZSBhbmQgdXNlIERJQyBvZiB0aGUgZm91ciBtb2RlbHMgdG8gZGVjaWRlIHdoaWMgbW9kZWwgaXMgbW9zdCBhcHByb3ByaWF0ZSB0byB0aGUgZGF0YS4KCgoKCgoKCgo=